package singleton;

import java.security.PublicKey;

public class SingleObject {
    public static void main(String[] args) {
        Laowang laowang1=Laowang.laowang;
        Laowang laowang2=Laowang.laowang;
        System.out.println(laowang1==laowang2);
    }
}

//一、饿汉式
//class Laowang{
//    private static Laowang laowang=new Laowang();
//    private Laowang(){}//私有化构造方法
//
//    //对外提供静态方法获取当前的Laowang
//    public static Laowang getLaowang(){
//        return laowang;
//    }
//}
//也可以用静态代码块static{}初始化laowang
//class Laowang{
//    private static Laowang laowang;
//    private Laowang(){}//私有化构造方法
//    static {
//        laowang=new Laowang();
//    }
//
//    //对外提供静态方法获取当前的Laowang
//    public static Laowang getLaowang(){
//        return laowang;
//    }
//}

//二、懒汉式，在此只演示线程安全的做法
//class Laowang{
//    private static Laowang laowang;
//    private Laowang(){}//私有化构造方法
//
//    //对外提供静态方法,创建实例然后返回,当前的Laowang
//    public static synchronized Laowang getLaowang(){
//        if (laowang == null) {
//            laowang=new Laowang();
//        }
//        return laowang;
//    }
//}
//三、双重检验
//class Laowang{
//    private volatile static Laowang laowang;
//    private Laowang(){}//私有化构造方法
//    //对外提供静态方法,创建实例然后返回,当前的Laowang
//    public static  Laowang getLaowang(){
//        if (laowang == null) {
//            synchronized (Laowang.class){
//                if (laowang==null){
//                    laowang=new Laowang();
//                }
//            }
//        }
//        return laowang;
//    }
//}

//四、内部类方式
//class Laowang{
//    private  Laowang(){} //私有化构造方法
//
//    //对外提供静态方法,调用内部类的属性，返回
//    public static final Laowang getLaowang(){
//        return laowangHolder.INSTANCE;
//    }
//    //静态内部类
//    private static final class laowangHolder{
//        private static final Laowang INSTANCE =new Laowang();
//    }
//}

//五、枚举方式
enum Laowang{
    laowang;
    public void whateverMethod(){}
}